<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
   "http://www.w3.org/TR/html4/strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>constructor</title>
	<meta name="author" content="Stark" />
	<!-- Date: 2018-10-19 -->
	<script type="text/javascript">
		/**
		 * 通过构造函数的方式创建，和基于工厂的创建类似
		 * 最大的区别就是函数的名称就是类的名称，按照java的约定，第一个
		 * 字母大写，使用构造函数创建时，在函数内部是通过this关键字
		 * 完成属性的定义
		 */
		function Person(name,age) {
			this.name = name;
			this.age = age;
			// 以下方式带来的问题就是所有的对象都会为该行为分配空间
			// this.say = function() {
				// alert(this.name+","+this.age);
			// }
			this.say = say;
		}
		
		/**
		 * 将行为设置为全局的行为，如果将所有的方法都设置为全局函数的时候
		 * 这个函数就可以被window调用，此时就破坏的对象的封装性
		 * 而且如果某个对象有大量的方法，就会导致整个代码充斥着大量的全局函数
		 * 这样将不利于开发
		 */
		function say() {
			alert(this.name+","+this.age);
		}
		/**
		 * 通过new Person来创建对象
		 */
		var p1 = new Person("Leno",22);
		var p2 = new Person("Ada",33);
		p1.say();
		p2.say();
		// 使用构造函数的方式可以通过以下方式来检查对象的类型
		alert(p1 instanceof Person);
		/**
		 * 使用构造函数创建所带来的第一个问题就是每一个对象中
		 * 都会存在一个方法的拷贝，如果对象的行为很多的话
		 * 空间的占用率就会大大增加
		 * 可以将函数放到全局变量中来定义，这样可以让类中的行为指向同一个函数
		 */
		alert(p1.say==p2.say);
	</script>
</head>
<body>

</body>
</html>

